from functools import reduce
from src.netWork.OOP.Node import Node as Node
from src.netWork.OOP.ConstNode import ConstNode as ConstNode


class Layer(object):

    __slots__ = ('layer_index', 'nodes')

    def __init__(self, layer_index, node_count):
        '''
        初始化一层
        layer_index: 层编号
        node_count: 层所包含的节点个数
        '''
        self.layer_index = layer_index
        # 当前层节点编号
        self.nodes = []
        for i in range(node_count):
            self.nodes.append(Node(layer_index, i))
        # 常数节点 ωb节点
        self.nodes.append(ConstNode(layer_index, node_count))

    def set_output(self, data):
        '''
        设置层的输出。当层是输入层时会用到。
        '''
        for i in range(len(data)):
            self.nodes[i].set_output(data[i])

    def calc_output(self):
        '''
        计算层的输出向量
        层的输出是一个各个节点输出值组成的向量
        '''
        for node in self.nodes[:-1]:
            node.calc_output()

    def dump(self):
        '''
        打印层的信息
        '''
        for node in self.nodes:
            print(node)
